import { useGlobSetting } from '/@/hooks/setting';
const globSetting = useGlobSetting();
const urlPrefix = globSetting.urlPrefix;
import { getToken } from '/@/utils/auth';
import { useUserStoreWithOut } from '/@/store/modules/user';
import moment from 'moment';
import { getAppEnvConfig } from '/@/utils/env';
const { VITE_GLOB_API_URL, VITE_GLOB_API_URL_PREFIX } = getAppEnvConfig();

export class WebSocketClient {
  constructor(options) {
    // 默认配置

    const defaultOptions = {
      url: `${VITE_GLOB_API_URL}${VITE_GLOB_API_URL_PREFIX}`,
      reconnectInterval: 5000, // 重连间隔（毫秒）
      maxReconnectAttempts: 10, // 最大重连次数
      autoReconnect: true, // 是否自动重连
    };
    if (VITE_GLOB_API_URL.includes('http')) {
      defaultOptions.url = VITE_GLOB_API_URL.split('http://')[1];
    }
    //获取项目编码
    const userStore = useUserStoreWithOut();
    let projectCode = userStore.getUserCurrentProjectCode;
    this.options = {
      ...defaultOptions,
      ...options,
      //完整的URL路径：vite中的前缀+调用方法中的url（module/topic）+项目编码+requestId（时间戳）
      // url: defaultOptions.url + options.url + `/` + projectCode + `/${moment().valueOf()}`,
      //地址使用传入的完整url
      url: options.url,
    };
    this.socket = null;
    this.reconnectAttempts = 0;
    this.subscriptions = {}; // 消息订阅回调（按消息类型分类）
    this.init();
  }

  // 初始化连接
  init() {
    // this.socket = new WebSocket(`ws://${this.options.url}`);
    //地址使用传入的完整url
    this.socket = new WebSocket(this.options.url);

    // 连接成功
    this.socket.onopen = () => {
      console.log('WebSocketClient init onopen');
      this.reconnectAttempts = 0; // 重置重连计数器
      if (this.options.onOpen) this.options.onOpen();
      else console.log('WebSocketClient init connected');
    };

    // 接收消息
    this.socket.onmessage = (event) => {
      console.log('WebSocketClient init onmessage', event);
      try {
        let message = event.data;
        if (!message) return;
        //接收到的消息不一定是json格式，所有格式的消息内容均进行事件触发
        if (this.options.onMessage) this.options.onMessage(message);
        // 触发对应类型的订阅回调
        // if (this.subscriptions[type]) {  // type需要接口返回, 区分不同数据, 暂时不需要
        //   this.subscriptions[type].forEach(callback => callback(message));
        // }
      } catch (error) {
        console.error('WebSocketClient init onmessage', error);
      }
    };

    // 连接关闭
    this.socket.onclose = () => {
      console.log('WebSocketClient init onclose');
      if (this.options.onClose) this.options.onClose();
      // 自动重连逻辑 暂时不需要判断 && this.reconnectAttempts < this.options.maxReconnectAttempts, 如果需要限制最大重连次数再判断
      if (this.options.autoReconnect) {
        setTimeout(() => {
          this.reconnectAttempts++;
          console.log('WebSocketClient init onclose' + `尝试第 ${this.reconnectAttempts} 次重连...`);
          this.init();
        }, this.options.reconnectInterval);
      }
    };

    // 错误处理
    this.socket.onerror = () => {
      console.error('WebSocketClient init onerror');
      if (this.options.onError) this.options.onError();
    };
  }

  // 订阅不同type消息
  on(type, callback) {
    if (!this.subscriptions[type]) {
      this.subscriptions[type] = [];
    }
    this.subscriptions[type].push(callback);
    return this; // 支持链式调用
  }

  // 发送消息
  send(data) {
    console.log('WebSocketClient init send', data);
    if (this.socket.readyState == WebSocket.OPEN) {
      //发送的消息为最终内容，需要在调用处进行转换；发送处不再转换为json字符串
      // this.socket.send(JSON.stringify(data));
      this.socket.send(data);
    } else {
      console.error('WebSocketClient init send', error);
    }
  }

  // 主动关闭连接
  close() {
    this.options.autoReconnect = false; // 禁用自动重连
    this.socket.close();
  }
}
